package com.two;

import cn.hutool.core.io.FileUtil;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class LoginJFrame extends JFrame implements MouseListener {
    private  ArrayList<User> allUser = new ArrayList<>();
    //游客模式
    /*static {//写在静态代码块里面了
        allUser.add(new User("zhangsan","123456789"));
        allUser.add(new User("lisi","987654321"));
    }*/
    JButton loginButton = new JButton();
    JButton registerButton = new JButton();
    JTextField username = new JTextField();
    //密文形式显示密码*******
    JPasswordField password = new JPasswordField();
    JTextField code = new JTextField();
    //正确的验证码
    JLabel rightCode = new JLabel();
    private JButton disappearPassword = new JButton();
    //设置密码不显示出来
    private boolean passwordVisible=false;
    public LoginJFrame() {
        //将用户信息写在构造方法中，通过文件读取用户信息
        readUserInfo();
        initJFrame();
        //添加内容
        initContent();
        this.setVisible(true);
    }
    //读取本地文件中的用户信息，并将其放到allUser集合中
    private void readUserInfo() {
        //读取数据
        //List<String> userInfoStrList = FileUtil.readUtf8Lines("D:\\JavaprojectIdea\\puzzlegame\\userinfo.txt");
        //读取文件的相对路径
        //List<String> userInfoStrList = FileUtil.readUtf8Lines(FileUtil.file("userinfo.txt"));
        //读取文件
        File file = new File("userinfo.txt");
        List<String> userInfoStrList = new ArrayList<>();

        try (BufferedReader br = new BufferedReader(new FileReader(file))) {
            String line;
            while ((line = br.readLine()) != null) {
                userInfoStrList.add(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        //遍历集合，获取用户信息，创建User对象
        for(String userInfoStr : userInfoStrList){
            //username=zhangsan&password=123456789
            //拆分字符串，解析字符串
            String[] userInfoArr = userInfoStr.split("&");
            String[] username = userInfoArr[0].split("=");
            String[] password = userInfoArr[1].split("=");
            //封装为User对象
            User user = new User(username[1], password[1]);
            //将user对象添加到allUser集合中
            allUser.add(user);
        }
    }

    private void initJFrame() {
        this.setSize(483,428);
        //this.setSize(495,445);
        this.setTitle("拼图游戏 v1.0登录");
        //将登陆页面设置为不能拖动
        this.setResizable(false);
        //设置应用图标
        try {
            this.setIconImage(ImageIO.read(new File("image\\logo.png")));
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //设置居中
        this.setLocationRelativeTo(null);
        //取消内部默认布局
        this.setLayout(null);
        //设置关闭模式
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    private void initContent() {
        //添加用户名文字
        JLabel usernameLabel = new JLabel(new ImageIcon("image\\login\\用户名.png"));
        usernameLabel.setBounds(116, 135, 47, 17);

        this.getContentPane().add(usernameLabel);
        //添加用户输入框
        username.setBounds(195, 130, 200, 30);
        this.getContentPane().add(username);

        //添加密码文字
        JLabel passwordLabel = new JLabel(new ImageIcon("image\\login\\密码.png"));
        passwordLabel.setBounds(130, 195, 32, 16);
        this.getContentPane().add(passwordLabel);
        //添加密码输入框
        password.setBounds(195, 190, 200, 30);
        password.setEchoChar('*');
        //设置密码输入框为密文形式
        this.getContentPane().add(password);
        disappearPassword.setIcon(new ImageIcon("image\\register\\隐藏密码.png"));
        disappearPassword.setBounds(397, 190, 30, 30);
        disappearPassword.setBorderPainted(false);
        disappearPassword.setContentAreaFilled(false);
        disappearPassword.addMouseListener(this);
        this.getContentPane().add(disappearPassword);

        //添加验证码文字
        JLabel codeLabel = new JLabel(new ImageIcon("image\\login\\验证码.png"));
        codeLabel.setBounds(116, 256, 50, 30);
        this.getContentPane().add(codeLabel);
        //添加验证码输入框
        code.setBounds(195, 256, 100, 30);
        this.getContentPane().add(code);

        String codeStr = CodeUtil.getCode();
        //设置内容
        rightCode.setText(codeStr);
        //绑定鼠标事件
        rightCode.addMouseListener(this);
        rightCode.setBounds(300, 256, 50, 30);
        this.getContentPane().add(rightCode);
        //添加登录按钮
        loginButton.setBounds(123,310,128,47);
        loginButton.setIcon(new ImageIcon("image\\login\\登录按钮.png"));
        //美化按钮
        //去除按钮的边框
        loginButton.setBorderPainted(false);
        //去除按钮的背景
        loginButton.setContentAreaFilled(false);
        //绑定鼠标事件
        loginButton.addMouseListener(this);
        this.getContentPane().add(loginButton);
        //添加注册按钮
        registerButton.setBounds(256,310,128,47);
        registerButton.setIcon(new ImageIcon("image\\login\\注册按钮.png"));
        //美化按钮
        //去除按钮的边框
        registerButton.setBorderPainted(false);
        //去除按钮的背景
        registerButton.setContentAreaFilled(false);
        //绑定鼠标事件
        registerButton.addMouseListener(this);
        this.getContentPane().add(registerButton);
        //添加背景图片
        JLabel background = new JLabel(new ImageIcon("image\\login\\background.png"));
        background.setBounds(0,0,470,390);
        this.getContentPane().add(background);
    }
    //点击
    @Override
    public void mouseClicked(MouseEvent e) {
        Object obj = e.getSource();
        if(obj==loginButton){
            //System.out.println("登录按钮");
            //获取两个文本输入框中的内容
            String usernameStr = username.getText();
            String passwordStr = new String(password.getPassword());
            //获取验证码
            String codeStr = code.getText();
            //创建一个User对象
            User userInfo = new User(usernameStr,passwordStr);
            //System.out.println("用户输入的用户名为" + usernameStr);
            //System.out.println("用户输入的密码为" + passwordStr);
            //处理判断
            if(usernameStr.isEmpty()||passwordStr.isEmpty()){
                //校验用户名和密码是否为空
                //System.out.println("用户名或者密码为空");
                //调用showJDialog方法并展示弹框
                showJDialog("           用户名或者密码为空");
            }
            else if(codeStr.length()!=5){
                //System.out.println("验证码长度不正确");
                //调用showJDialog方法并展示弹框
                showJDialogArea("           请检查问题出现的原因：\n1.验证码为空\n2.验证码长度不正确\n3.验证码输入错误");
            }
            else if(!codeStr.equalsIgnoreCase(rightCode.getText())){
                showJDialog("           验证码输入错误");
            }
            else if(isExist(userInfo) && codeStr.equals(rightCode.getText())){
                //System.out.println("用户名和密码正确可以开始玩游戏了");
                //关闭当前登录界面
                this.dispose();
                //打开游戏的主界面
                //需要把当前登录的用户名传递给游戏界面
                new GameJFrame();


            }
            else{
                //System.out.println("用户名和密码不正确");
                //调用showJDialog方法并展示弹框
                showJDialog("           用户名或密码不正确");
            }
        }
        else if(obj==registerButton){
            //System.out.println("注册按钮");
            //关闭当前登录界面-->需要双击才能关闭
            //this.dispose();
            //单击关闭登录页面
            this.setVisible(false);
            //打开注册界面
            new RegisterJFrame(allUser);
        }
        else if(obj==rightCode){
            //System.out.println("更换验证码");
            //重新生成验证码
            String codeStr = CodeUtil.getCode();
            //设置内容
            rightCode.setText(codeStr);
            //给某个组件设置提示信息
            rightCode.setToolTipText("点击刷新");
            //rightCode.setEnabled(false);
        }
        else if(obj==disappearPassword){
            //显示密码
            //passwordTextField.setEchoChar((char)0);
            //图片由隐藏变为显示
            //disappearPassword.setIcon(new ImageIcon("image\\register\\显示密码.png"));
            if (passwordVisible) {
                password.setEchoChar('*');
                //切换为显示密码的图标
                disappearPassword.setIcon(new ImageIcon("image\\register\\隐藏密码.png"));
            } else {
                //切换为隐藏密码的图标
                password.setEchoChar((char) 0);
                disappearPassword.setIcon(new ImageIcon("image\\register\\显示密码.png"));
            }
            //切换密码显示状态
            passwordVisible = !passwordVisible;
        }
    }
    //显示信息弹窗
    private void showJDialog(String content) {
        //创建一个弹框对象
        JDialog jDialog = new JDialog();
        //给弹框设置大小
        jDialog.setSize(200, 150);
        //让弹框置顶
        jDialog.setAlwaysOnTop(true);
        //让弹框居中
        jDialog.setLocationRelativeTo(null);
        //弹框不关闭永远无法操作下面的界面
        jDialog.setModal(true);
        //设置应用图标
        try {
            jDialog.setIconImage(ImageIO.read(new File("image\\logo.png")));
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        //创建Jlabel对象管理文字并添加到弹框当中
        JLabel warning = new JLabel(content);
        warning.setBounds(0, 0, 200, 150);
        jDialog.getContentPane().add(warning);
        //让弹框展示出来
        jDialog.setVisible(true);
    }
    private void showJDialogArea(String content){
        //创建一个弹框对象
        JDialog jDialog = new JDialog();
        if(!jDialog.isVisible()){
            //把弹框中原来的文字给清空
            jDialog.getContentPane().removeAll();
            //JLabel jLabel=new JLabel(content);
            JTextArea jTextArea=new JTextArea(content);
            jTextArea.setOpaque(false);
            //不可编辑
            jTextArea.setEditable(false);
            jTextArea.setBounds(0,0,200,150);
            jDialog.getContentPane().add(new JScrollPane(jTextArea));
            //jLabel.setBounds(0,0,200,150);
            //jDialog.add(jLabel);
            //给弹框设置大小
            jDialog.setSize(200,150);
            jDialog.setAlwaysOnTop(true);
            jDialog.setLocationRelativeTo(null);
            jDialog.setModal(true);
            //设置应用图标
            try {
                jDialog.setIconImage(ImageIO.read(new File("image\\logo.png")));
            } catch (IOException ex) {
                ex.printStackTrace();
            }
            jDialog.setVisible(true);
        }
    }
    //判断用户在集合中是否存在
    private boolean isExist(User usernameStr){
        for(int i=0;i<allUser.size();i++){
            User rightUser = allUser.get(i);
            if(rightUser.getUsername().equals(usernameStr.getUsername())&&rightUser.getPassword().equals(usernameStr.getPassword())){
                //有相同的代表存在，返回true，后面的不需要再比较了
                return true;
            }
        }
        //循环结束之后还没有找到就表示不存在
        return false;
    }
    //按下不松
    @Override
    public void mousePressed(MouseEvent e) {
        if(e.getSource()==loginButton){
            loginButton.setIcon(new ImageIcon("image\\login\\登录按下.png"));
        }
        else if(e.getSource()==registerButton){
            registerButton.setIcon(new ImageIcon("image\\login\\注册按下.png"));
        }
    }
    //松开
    @Override
    public void mouseReleased(MouseEvent e) {
        if(e.getSource()==loginButton){
            loginButton.setIcon(new ImageIcon("image\\login\\登录按钮.png"));
        }
        else if(e.getSource()==registerButton){
            registerButton.setIcon(new ImageIcon("image\\login\\注册按钮.png"));
        }
    }
    //鼠标划入
    @Override
    public void mouseEntered(MouseEvent e) {

    }
    //鼠标划出
    @Override
    public void mouseExited(MouseEvent e) {

    }
}
